﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Acceso_a_Datos.IDAOS;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using System.Xml;
using System.Data.SqlTypes;

namespace Sistema_Totem.Acceso_a_Datos.DAOS
{
    public class DAODocumentoRequerimiento : DAOSQLServer, iDAODocumentoRequerimiento
    {
        #region Atributos

            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();

        #endregion Atributos

        #region Agregar Requerimiento
        
        /// <summary>
        /// Método que accede a la base de datos para 
        /// agregar un requerimiento.
        /// </summary>
        /// <param name="requerimiento"></param>
        /// <returns></returns>
        public bool AgregarRequerimiento(Requerimiento requerimiento, int idProyecto)
        {
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSRequerimiento]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto", idProyecto);
                command.Parameters.Add(new SqlParameter("@XmlRequerimiento",SqlDbType.Xml)
                {
                    Value = new SqlXml(new XmlTextReader
                        (requerimiento.Contenido.InnerXml, 
                        XmlNodeType.Document, null))
                });

                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                return true;
            }
            catch (SqlException e)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }
            finally
            {
                bd.CerrarConexionBd();
            }
        }
        
        #endregion Agregar Requerimiento

        #region Modificar Requerimiento

        /// <summary>
        /// Método que accede a la base de datos para
        /// modificar un requerimiento específico.
        /// </summary>
        /// <param name="requerimiento"></param>
        /// <returns></returns>
        public bool ModificarRequerimiento(Requerimiento requerimiento)
        {
            SqlDataReader reader = null;

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[UDPRequerimiento]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idRequerimiento", 
                    requerimiento.Id);
                command.Parameters.Add(new SqlParameter("@XmlRequerimiento",
                    SqlDbType.Xml)
                {
                    Value = new SqlXml(new XmlTextReader
                        (requerimiento.Contenido.InnerXml, 
                        XmlNodeType.Document, null))
                });

                reader = command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }

            catch (Exception)
            {
                return false;
            }
            finally
            {
                bd.CerrarConexionBd();
            }
        }

        #endregion Modificar Requerimiento

        #region Consultar Requerimiento

        /// <summary>
        /// Método que accede a la base de datos para
        /// consultar un requerimiento determinado.
        /// </summary>
        /// <param name="idRequerimiento"></param>
        /// <returns></returns>
        public List<Requerimiento> ConsultarRequerimiento(int _idProyecto)
        {
            Requerimiento _requerimiento = null;
            List<Requerimiento> listaReq1 = new List<Requerimiento>();
            SqlDataReader reader = null;

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELRequerimiento]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto",
                    _idProyecto);

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    string xml = reader.GetSqlXml(2).Value;
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(xml);
                    _requerimiento = (Requerimiento) 
                        FabricaEntidad.NuevoRequerimiento();
                    _requerimiento.Contenido = doc;
                    _requerimiento.Id =  Convert.ToInt32(reader[0]);
                    listaReq1.Add(_requerimiento);
                }
                
            }
            catch (SqlException)
            {
               // return listaReq1;
            }

            catch (Exception)
            {
               // return listaReq1;
            }
            finally
            {
                bd.CerrarConexionBd();
            }
            return listaReq1;
        }

        #endregion Consultar Requerimiento

        #region Eliminar Requerimiento

        /// <summary>
        /// Metodo que accede a la base de datos para
        /// eliminar un requerimiento específico.
        /// </summary>
        /// <param name="idRequerimiento"></param>
        /// <returns></returns>
        public bool EliminarRequerimiento(int _idRequerimiento)
        {
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; 
                command.CommandText = "[dbo].[DELRequerimiento]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idRequerimiento", 
                    _idRequerimiento);
                SqlDataReader readers = command.ExecuteReader();
                readers.Close();
                
            }
            catch (SqlException)
            {
             
            }

            catch (Exception)
            {
                
            }
            finally
            {
                bd.CerrarConexionBd();
            }
            return true;
        }

        #endregion Eliminar Requerimiento
    }
}